package mybatis.executor;

import mybatis.mapping.MappedStatement;
import mybatis.transaction.Transaction;

import java.sql.SQLException;
import java.util.List;

/**
 * SQL查询执行器接口
 *
 * @author richie696
 * @version 1.0
 * @since 2020/11/07
 */
public interface Executor {

    Transaction getTransaction();

    /**
     * 执行数据库更新操作的方法
     *
     * @param mappedStatement SQL映射关系对象
     * @param parameter       更新参数
     * @return 返回受影响的数据库行数
     * @throws SQLException 当查询过程中产生数据库相关的错误时抛出该异常
     */
    int update(MappedStatement mappedStatement, Object parameter) throws SQLException;

    /**
     * 执行数据库查询的方法
     *
     * @param mappedStatement SQL映射关系对象
     * @param parameters      查询参数
     * @param <E>             查询结果泛型对象
     * @return 返回符合查询条件的结果对象
     * @throws SQLException 当查询过程中产生数据库相关的错误时抛出该异常
     */
    <E> List<E> query(MappedStatement mappedStatement, Object... parameters) throws SQLException;

    void commit(boolean force) throws SQLException;

    void rollback(boolean force) throws SQLException;

    void close(boolean forceRollback);

    boolean isClosed();

}
